//
// Created by martin on 2/13/22.
//

#ifndef MUDUO_EVENTLOOPTHREAD_H
#define MUDUO_EVENTLOOPTHREAD_H

#include "muduo/base/noncopyable.h"
#include "muduo/base/Mutex.h"
#include "muduo/base/Condition.h"
#include "muduo/base/Thread.h"

#include <functional>

namespace muduo
{
namespace net
{

class EventLoop;

class EventLoopThread : noncopyable
{
public:
    typedef std::function<void (EventLoop*)> ThreadInitCallback;

    EventLoopThread(const ThreadInitCallback& cb = ThreadInitCallback(),
                    const string& name = string());
    ~EventLoopThread();

    /* 启动IO线程函数中的loop循环, 返回IO线程中创建的EventLoop对象地址(栈空间) */
    EventLoop* startLoop();

private:
    void threadFunc(); // IO线程函数

    // 思考:这里为什么需要mutex_保护, 而EventLoopThreadPool::baseLoop_却不需要?
    EventLoop* loop_ GUARDED_BY(mutex_); // 绑定的EventLoop对象指针
    bool exiting_;  // 暂无特殊用途
    Thread thread_; // 线程, 用于实现IO线程中的线程功能
    MutexLock mutex_; // 互斥锁
    Condition cond_ GUARDED_BY(mutex_); // 条件变量
    ThreadInitCallback callback_;       // 线程函数初始回调
};

} // namespace net
} // namespace muduo

#endif //MUDUO_EVENTLOOPTHREAD_H
